package com.atguigu.exp;

import com.atguigu.resp.ResultData;
import com.atguigu.resp.ReturnCodeEnum;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
 * 全局异常处理器，用于统一处理系统中抛出的异常
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理业务异常(BusinessException)的方法
     * 当系统抛出BusinessException异常时，会进入此方法进行统一处理
     *
     * @param e 业务异常对象，包含异常码和异常信息
     * @param request HTTP请求对象，用于获取请求URL等信息
     * @return 返回封装的错误结果数据，包含错误码、错误信息和请求URL
     */
    @ExceptionHandler(BusinessException.class)
    public ResultData<String> handleBusinessException(BusinessException e, HttpServletRequest  request) {
        // 打印方法进入日志，标识处理自定义BusinessException
        System.out.println("#####come in GlobalExceptionHandler的handleBusinessException方法，主管自定义的BusinessException");
        // 记录异常日志，包括请求URL和异常详细信息
        log.error("请求：{}，发生异常：{}", request.getRequestURL(), e.getMessage(), e);
        // 返回失败结果，包含异常码、异常信息和请求URL
        return ResultData.fail(e.getCode(), e.getMsg()+" 你的请求url："+request.getRequestURL());
    }

    /**
     * 处理运行时异常(RuntimeException)的方法
     * 当系统抛出RuntimeException及其子类异常时，会进入此方法进行统一处理
     *
     * @param e 运行时异常对象
     * @return 返回封装的错误结果数据，使用系统内部错误码和异常信息
     */
    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  //设置HTTP响应状态码为500（服务器内部错误）
    public ResultData<String> handleRuntimeException(Exception e) {
        // 打印方法进入日志，标识处理RuntimeException
        System.out.println("#####come in GlobalExceptionHandler的exception方法，主管RuntimeException");
        // 记录全局异常日志
        log.error("全局异常信息:{}",e.getMessage(),e);
        // 返回500内部服务器错误结果
        return ResultData.fail(ReturnCodeEnum.RC500.getCode(),e.getMessage());
    }
}

